﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;

namespace Core.Connexions
{
    public class ConnexionTransport
    {
        private static List<ConnexionTransport> listeConnexions = new List<ConnexionTransport>(); //Liste de connexion transport

        private byte idConnexionLogique;            //Id de connexion transport
        private EtatsConnexion etat;                //État de la connexion transport
        private byte applicationId;                 //Id de l'application qui utilise cette connexion
        private byte adresseSource;                 //Adresse source de cette connexion
        private byte adresseDestination;            //Adresse destination de cette connexion
        private Queue<string> data;                 //File de données en attente d'être envoyées

        private ConnexionTransport(byte applicationId, byte adresseSource, byte adresseDestination)
        {
            if (listeConnexions.Count > 0)
                this.idConnexionLogique = (byte)(listeConnexions.Max(c => c.idConnexionLogique) + 1);
            else
                this.idConnexionLogique = 1;

            this.etat = EtatsConnexion.AttenteConnexion;
            this.applicationId = applicationId;
            this.adresseSource = adresseSource;
            this.adresseDestination = adresseDestination;
            this.data = new Queue<string>();
        }

        #region Propriétés

        public static List<ConnexionTransport> ListeConnexions { get { return listeConnexions.ToList(); } }

        public byte IdConnexionLogique { get { return idConnexionLogique; } }
        public EtatsConnexion Etat { get { return etat; } set { etat = value; } }
        public byte ApplicationId { get { return applicationId; } }
        public byte AdresseSource { get { return adresseSource; } }
        public byte AdresseDestination { get { return adresseDestination; } }
        public Queue<string> Data { get { return data; } set { data = value; } }

        #endregion

        /// <summary>
        /// Méthode qui retourne une connexion transport selon les paramètres applicationId, adresseSource et adresseDestination.
        /// </summary>
        /// <returns>Retourne la connexion existante si existe déjà ou sinon une nouvelle connexion</returns>
        public static ConnexionTransport GetConnexion(byte applicationId, byte adresseSource, byte adresseDestination)
        {
            ConnexionTransport connexion = listeConnexions.Find(c => c.applicationId == applicationId && c.adresseDestination == adresseDestination);
            if (connexion == null)
            {
                connexion = new ConnexionTransport(applicationId, adresseSource, adresseDestination);
                listeConnexions.Add(connexion);
            }
            return connexion;
        }

        /// <summary>
        /// Méthode qui retourne une connexion transport selon le paramètre adresseReponse.
        /// </summary>
        /// <returns>Retourne la connexion existante si existe. Sinon, retourne null</returns>
        public static ConnexionTransport GetConnexion(byte adresseReponse)
        {
            ConnexionTransport connexion = listeConnexions.Find(c => c.idConnexionLogique == adresseReponse);
            return connexion;
        }

        /// <summary>
        /// Détruit la connexion. (Enlève la connexion de la liste de connexions static).
        /// </summary>
        public void Destroy()
        {
            listeConnexions.Remove(this);
        }
    }
}
